/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes.TacticaBloodwall;

import futbol.tacticas.*;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;

/**
 *
 * @author Bloodwall
 */
public class TacticaBloodwall implements Tactica{
    
    private int nValores[][]={
        {64,30,7}, //Jugador1 
        {-150,0,9}, //Jugador2 
        {-96,0,5}, //Jugador3 
        {-64,-46,5}, //Jugador4 
        {-64,46,5}, //Jugador5 
        {0,0,6}, //Jugador6 
        {32,-60,7}, //Jugador7 
        {32,60,7}, //Jugador8 
        {64,-30,7}, //Jugador9 
        {96,-90,7}, //Jugador10 
        {96,90,7}, //Jugador11 
        
    };
    private int antxb=-1000;
    private int antyb=-1000;

    public String getNombre() {
        return "Bloodwall";
    }

    public Color getColor1() {
       return Color.BLACK;
    }

    public Color getColor2() {
        return Color.red;
    }

    public Color getColorNumero() {
        return Color.CYAN;
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    public int getXInicial(int n) {
       return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        int nJug=sj.getMasCercanoDeBola();
        Point bola=sj.getBola();
        Point j[]=sj.getMisJugadores();
        int n,y;
        
        for (n=0;n<11;n++){
           com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        }
        
        if(nJug==1){
            com.add(new ComandoIrA(2,bola.getX(),bola.getY()));
            com.add(new ComandoIrA(3,bola.getX(),bola.getY()));
            com.add(new ComandoIrA(4,bola.getX(),bola.getY()));
        }
        else{
            if(((antxb>bola.getX() && j[nJug].getX()<bola.getX())
                  ||(antxb<bola.getX() && j[nJug].getX()>antxb))
                  && marcat(sj,nJug)!=true){
                com.add(new ComandoIrA(nJug,j[nJug].getX(),bola.getY()));
            }
            else{
                com.add(new ComandoIrA(nJug,bola.getX(),bola.getY()));
            }
        }
        
        portero(sj,com);
        
        
        for (n=0;n<11;n++){
            jogada(sj,com,n);
        }
        
        antxb=(int)bola.getX();
        antyb=(int)bola.getY();
        return com;
    }
    
    private void jogada(SituacionJugadores sj, Vector<Comando> com,int n){
        int i=0;
        int array[];
        
        
        switch(n){
            case 0:
                com.add(new ComandoTiroAPuerta(n,0));
                break;
            case 1:
                com.add(new ComandoTiroAPuerta(n,0));
                break;
            case 2:
                if(marcat(sj,n)==true){
                    com.add(new ComandoTiroAPuerta(n,0));
                }
                else{
                    array=new int[3];
                    array[0]=5;
                    array[1]=3;
                    array[2]=4;
                    i=defmed(sj,2,array);
                    com.add(new ComandoPase(n,i));
                }
                break;
            case 3:
                if(marcat(sj,n)==true){
                    com.add(new ComandoTiroAPuerta(n,0));
                }
                else{
                    array=new int[2];
                    array[0]=5;
                    array[1]=6;
                    i=defmed(sj,3,array);
                    com.add(new ComandoPase(n,i));
                }
                break;
            case 4:
                if(marcat(sj,n)==true){
                    com.add(new ComandoTiroAPuerta(n,0));
                }
                else{
                    array=new int[2];
                    array[0]=5;
                    array[1]=7;
                    i=defmed(sj,4,array);
                    com.add(new ComandoPase(n,i));
                }
                break;
            case 5:
                if(marcat(sj,n)==true){
                    com.add(new ComandoTiroAPuerta(n,0));
                }
                else{
                    array=new int[4];
                    array[0]=10;
                    array[1]=8;
                    array[2]=0;
                    array[3]=6;
                    i=defmed(sj,5,array);
                    com.add(new ComandoPase(n,i));
                }
                break;
            case 6:
                if(marcat(sj,9)==true && marcat(sj,8)==true){
                    com.add(new ComandoTiroAPuerta(n,0));
                }
                else{
                    array=new int[2];
                    array[0]=8;
                    array[1]=9;
                    i=defmed(sj,6,array);
                    com.add(new ComandoPase(n,i));
                }
                break;
            case 7:
                if(marcat(sj,0)==true && marcat(sj,10)==true){
                    com.add(new ComandoTiroAPuerta(n,0));
                }
                else{
                    array=new int[2];
                    array[0]=0;
                    array[1]=10;
                    i=defmed(sj,7,array);
                    com.add(new ComandoPase(n,i));
                }
                break;
            case 8:
                com.add(new ComandoTiroAPuerta(n,0));
                break;
            case 9:
                com.add(new ComandoTiroAPuerta(n,0));
                break;
            case 10:
                com.add(new ComandoTiroAPuerta(n,0));
                break;
        }
    }
     
    private void portero(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        int y=0;
        
        if(antxb!=-1000 && (antxb - (int)bola.getX())!=0){
            if(antxb > (int)bola.getX()){
                y=((antyb - (int)bola.getY())/(antxb - (int)bola.getX()))*
                    (-150 -(int)bola.getX())+(int)bola.getY();
                if(y<-30){
                    y=-30;
                }
                if(y>30){
                    y=30;
                }
                com.add(new ComandoIrA(1,-150,y));
            }
            else{
                com.add(new ComandoIrA(1,nValores[1][0],nValores[1][1]));
            }
        }
        else{
            com.add(new ComandoIrA(1,nValores[1][0],nValores[1][1]));
        }
     }
     
    private boolean trajneta(SituacionJugadores sj, int n, int n2){
        Point j[]=sj.getMisJugadores();
        Point ej[]=sj.getContrario();
        int y=0;
        boolean bool=true;

        for(int i=0; i<11;i++){
            if((int)ej[i].getX()<(int)j[n2].getX() &&
                    (int)ej[i].getX()>(int)j[n].getX() &&
                    (int)j[n2].getX() - (int)j[n].getX()!=0){

                y=((((int)j[n2].getY() - (int)j[n].getY())/
                    ((int)j[n2].getX() - (int)j[n].getX()))*
                    ((int)ej[i].getX() - (int)j[n].getX())+(int)j[n].getY());
                
                if(y+10>ej[i].getY() && y-10<ej[i].getY()){
                    bool=false;
                }
            }
        }
        return bool;
     }
     
    private boolean marcat(SituacionJugadores sj, int n){
         int enemic,x,y;
         Point j[]=sj.getMisJugadores();
         Point ej[]=sj.getContrario();
         
         enemic=sj.getContrarioMasCerca(n);
         
         x=((int)j[n].getX()+160)- ((int)ej[enemic].getX()+160);
         y=((int)j[n].getY()+120)- ((int)ej[enemic].getY()+120);
         if((x<10 && x>-10) && (y<10 && y>-10)){
            return true;
         }
         else{
            return false;
         }
     }
     
    private int defmed(SituacionJugadores sj, int n, int array[]){
         int volta=0, max=0, maxpunt=0, punt=0;
         
         while(volta<array.length){
             if(false==marcat(sj,array[volta])){
                punt++;
                punt++;
             }
             if(true==trajneta(sj,n,array[volta])){
                punt++;
             }
             if(maxpunt<=punt){
                maxpunt=punt;
                max=array[volta];
             }
             volta++;
             punt=0;
         }
         
         return max;
     }
 
}